マネコン起動もできるAWSのスイッチロール用CLIツール「AWSume」の紹介
「スイッチロールからの作業、AWSのベストプラクティスだけれどツールの設定がめんどくさいよね」
ハマコー、最近会社のパソコンをIntel MacからM1 Macに切替たことがきっかけで、いろんなツールを再度セットアップしてました。
普段AWS触っている身としてはスイッチロールして作業する環境も必須なので、改めて最新ツールを物色していたところ、弊社技術番長の岩田御大に教えてもらったAWSumeというツールが圧倒的に便利だったので、前のめりに紹介します。
- 標準公式のconfigとcredentialファイルのみで動作し、別途設定ファイルは不要
- コマンドラインから、プロファイル名の自動補完に対応
- 指定したプロファイルから、マネジメントコンソールの起動も可能
と、スイッチロールに関わるほぼすべての領域を完全網羅しているツールで、セットアップもめちゃくちゃ簡単な素晴らしい逸品でした。普段AWS環境をスイッチロールで作業している全てのAWSユーザーにおすすめしたいツールです。
これが神ツールか…!! ( ゚д゚) ガタッ / ヾ __L| / ̄ ̄ ̄/_ \/ /
すぐ、神とかいうやん。
この記事を読む前提知識
この記事は、スイッチ用IAMロールの概念と作成方法、AWS CLIを利用するときの認証情報の設定などの基礎知識があることを前提としています。このあたりがまだ不安な方は、以下の記事を参考に、学びながらIAMロールの作成や、AWS CLIの設定を実施しておきましょう。
AWS CLIでスイッチロールするために必要なファイルの用意
IAMユーザーと、スイッチロールして作業するIAMロールを作成したら、以下の2つのファイルを用意します。
[default] aws_access_key_id = AKIAXXXXXXXXXXXXXXXXXXXXX aws_secret_access_key = vdYYYYYYYYYYYYYYYYYYYYYYYY
[default] region = ap-northeast-1 output = json [profile <スイッチロール時に指定するプロファイル名>] role_arn = arn:aws:iam::<スイッチロール先のアカウントID>:role/cm-hamada.koji mfa_serial = arn:aws:iam::<スイッチロール元のアカウントID>:mfa/cm-hamada.koji source_profile = default
mfa_serial
は、スイッチロール先のロールの信頼ポリシーでMFA認証が必須な場合に設定する必要があります。断言しますが、MFAを利用しないスイッチロールは超絶事故の原因になるので、必ず設定しておくことをオススメします。
利用するファイルの用途や設定内容の詳細は、以下を参考に。
AWSumeとは?
「AWSume」はセッショントークンの管理とIAMロール用のクレデンシャルを引受けるためのシンプル、かつ高機能なコマンドラインツールです。公式ページはこちら。
できることの概要は、公式ページから引用している下記動画GIFをみてもらえれば一目瞭然。どうです?便利そうでしょ?
AWSumeのセットアップ
セットアップはシンプル。以下公式手順に則って進めてください。
Installation and Quick Start | AWSume
自分のMacでは、クライアントにpipx
がなかったので、以下の手順で進めました。
$ brew install pipx $ pipx install awsume
自分の環境では、上記インストール実施後、以下のメッセージが表示されたので、メッセージにそって、awsume-configure
を実行することでエイリアス関連の設定が書き込まれました。
$ pipx install awsume Warning: the awsume shell script is not being sourced, please use awsume-configure to install the alias /Users/hamada.koji/.local/bin/awsume: line 183: return: can only `return' from a function or sourced script $ awsume-configure <以下の内容が、.bash_profileに書き込まれる> #AWSume alias to source the AWSume script alias awsume="source awsume" #Auto-Complete function for AWSume _awsume() { local cur prev opts COMPREPLY=() cur="${COMP_WORDS[COMP_CWORD]}" prev="${COMP_WORDS[COMP_CWORD-1]}" opts=$(awsume-autocomplete) COMPREPLY=( $(compgen -W "${opts}" -- ${cur}) ) return 0 } complete -F _awsume awsume
awsume-configure
は、AWSumeの初期セットアップ用のツールで、インストール時に自動セットアップがうまくいかなかったとき、手動実行するために用意されているツールです。インストールはできたけどどうにもエラーでうまく動かないときは、こちらのドキュメントを参考に再設定してみてください。
.bash_profile
が更新されているので、ターミナルを再起動します。
AWSumeを利用して、スイッチロールしてみる
実際のスイッチロール方法は、ものすごく簡単。これだけです。
awsume <profile_name>
例えば、以下のconfig
がある状態だとします。
[default] region = ap-northeast-1 output = json [profile cm-hamada] role_arn = arn:aws:iam::BBBBBBBBBB:role/cm-hamada.koji mfa_serial = arn:aws:iam::AAAAAAAAAA:mfa/cm-hamada.koji source_profile = default
こんな感じでスイッチロールできます。MFAが必須な場合は、途中でMFA tokenを聞かれます。
$ awsume cm-hamada Enter MFA token: 030152 Session token will expire at 2022-11-18 11:20:32 [cm-hamada] Role credentials will expire 2022-11-18 00:20:33
認証情報を確認するaws sts get-caller-identity
で、意図した認証情報を取得できていればOK。
aws sts get-caller-identity { "UserId": "AAAAAAAAAAAAAAAAAAA:cm-hamada", "Account": "BBBBBBBBBB", "Arn": "arn:aws:sts::BBBBBBBBBB:assumed-role/cm-hamada.koji/cm-hamada" }
認証情報をクリアする場合は、--unset
コマンドを使います。
awsume --unset
AWSumeの便利機能の数々!!
これだけでも自分としては、「めっちゃ便利やん!!」と感動しきりなんですが、様々な便利機能がAWSumeには搭載されているので、いくつか紹介します。
プロファイル名のオートコンプリート
開発〜ステージング〜本番など、複数環境でスイッチロールして作業する人も多いと思います。そんなときに便利なのが、プロファイル名のオートコンプリート。
例えば、config
がこんな感じになっていたとして。
[default] region = ap-northeast-1 output = json [profile cm-hamada] <中略> [profile cm-dev-hamada] <中略> [profile cm-prd-hamada] <中略>
プロファイル名を途中まで入力して、Tabキーを押すとこんな感じで、入力候補を表示してくれます。
$ awsume cm- <Tabキー入力> cm-dev-hamada cm-hamada cm-prd-hamada
プロファイル一覧の表示
-l, --list-profile
オプションで、設定されているプロファイルの一覧が表示可能。
$ awsume --list-profile Listing... ==========================AWS Profiles========================== PROFILE TYPE SOURCE MFA? REGION ACCOUNT cm-dev-hamada Role default Yes None BBBBBBBBBBBB cm-hamada Role default Yes None BBBBBBBBBBBB cm-prd-hamada Role default Yes None BBBBBBBBBBBB default User None No ap-northeast-1 Unavailable
クレデンシャル引受け時のコマンド表示
-s, --show-commands
オプションで、ロール引受時に実行されるクレデンシャル設定用のコマンドが表示されます。
$ awsume my-admin -s export AWS_ACCESS_KEY_ID=<SECRET> export AWS_SECRET_ACCESS_KEY=<SECRET export AWS_SESSION_TOKEN=<SECRET> export AWS_SECURITY_TOKEN=<SECRET> export AWS_REGION=<REGION> export AWS_DEFAULT_REGION=<REGION> export AWSUME_PROFILE=my-admin export AWSUME_EXPIRATION=<YYYY-mm-ddTHH:MM:SS>
「個人的に最高」マネジメントコンソールの起動
別途プラグインを導入することで、任意のプロファイルの認証情報を利用したマネジメントコンソールの起動ができます。これが神と言わずして何が神か!!
プラグインのインストール方法と利用法は、以下のページを参照。
awsumeインストール時の方法に合わせて、pipx
またはpip
でプラグインをインストールします。
pip install awsume-console-plugin or pipx inject awsume awsume-console-plugin
ここから先は、興奮しっぱなしですよ。
コンソールの起動
-c
オプションで、指定したプロファイルの認証情報を利用した状態で、デフォルトブラウザでマネジメントコンソールが起動します。最高に便利。
awsume <profile_name> -c
現在利用しているプロファイルを利用するだけなら、profile_name
は省略可能。
awsume -c
コンソールリンクの取得
-cl
オプションで、コンソールのURLが標準出力されます。
awsume <profile_name> -cl
サービスページを指定したマネジメントコンソールの起動
-cs
オプションとサービス名を指定することで、特定のサービスを指定した状態でマネジメントコンソールの起動が可能です。
awsume <profile_name> -cs <service>
例えば、こんな感じにすれば、指定したプロファイルでCloudFormationの画面が開きます。なんとまぁ小気味よい機能ですこと!!
awsume cm-hamada -cs cloudformation
その他、いろんなカスタム方法もあるようなので、あれこれ気になってみた方は、上で紹介した公式ページみて、あれこれ試してみてください!
MFAのワンタイムパスワードを1passwordから自動取得したい場合
専用のプラグインがあるらしいです。こちらを参考に設定してみましょう。ここまでやれば、めちゃくちゃ便利ですね。
AWSumeの「1PasswordからMFAを自動取得するプラグイン」を使ってみる | DevelopersIO
AWSumeはスイッチロールに関わる作業を全て完結できる素晴らしいツール
以前は似たようなものとして、assume-role
というツールを使っていました。
remind101/assume-role: Easily assume AWS roles in your terminal.
これをdirenvを併用して、ディレクトリ移動で自動的に対象プロファイルにスイッチロールする仕組みを利用していました。このブログには何度お世話になったことか…
[小ネタ]ディレクトリ移動した際に自動で一時クレデンシャルを取得・設定する | DevelopersIO
なのですが、最近Apple Silicon Macに変えたところ、assume-role
が動かなくなっており、そのための代替策として、以下のブログを試そうとしていたところでした。
- AWS CLIでスイッチロールして一時クレデンシャル情報を環境変数に設定するスクリプト | DevelopersIO
- お世話になってたディレクトリ移動だけでAWSのクレデンシャルを切り替える仕組みがM1 Macで動かなかったので替わりのスクリプトを書いた | DevelopersIO
そんな悩みを社内Slackにつぶやいたところ、弊社の技術番長岩田先生に教えてもらったのが、このAWSumeだったということです。
さらに、今まではマネジメントコンソールでの操作は、この便利ブラウザ拡張機能、aws-extend-switch-rolesに大変お世話になっていたのですが、AWSumeでブラウザ起動もなんとワンツールで完結できてしまいました。
世界中の全AWSユーザー歓喜のツールだと思うので、気になった方は是非一度試していただければと思います。
それでは、今日はこのへんで。濱田(@hamako9999)でした。